Godot3.5: カードゲームのカードをデッキからプレイヤーの手札に配るTweenのサンプル実装(3D)
カードゲームでカードをプレイヤーに配るtweenについての紹介
https://gyazo.com/7059bc46cdae900f962a96b01a7de9f1
ソースコードを確認したところ、3DのSpatial で実装している
カードの位置を決定しているコードが理解できなかった...
code:gd
func _create_and_animate_cards() -> void:
var tween := create_tween().set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_OUT)
if not hand.get_children().empty():
for child in hand.get_children():
tween.tween_property(child, "translation", cards_resting_place.translation, 1)
var card_count := int(rand_range(1, 5))
for child_index in card_count + 1:
# Create a new card instance
var new_card: Card3D = card_scene.instance()
new_card.card_art = preload("res://assets/blackhole.png")
new_card.card_name = "Black Hole"
new_card.translation = deck.translation
new_card.scale = Vector3.ZERO
new_card.translation.z -= 1
hand.add_child(new_card)
# Calculate the card's position, rotation, and scale in hand
var ratio_in_hand := float(child_index) / card_count
var target_translation := Vector3(
height_curve.interpolate(ratio_in_hand) * 2.0,
child_index * HEIGHT_DIFFERENCE,
-(HAND_SPREAD * card_count * 0.5) + child_index * HAND_SPREAD
)
var target_angle := -PI / 2.0 + rotation_curve.interpolate(ratio_in_hand) * CARD_ROTATION
var basis := Basis(Vector3.UP, target_angle).scaled(Vector3.ONE * 2.0)
var target_transform := Transform(basis, target_translation)
tween.tween_property(new_card, "scale", Vector3.ONE * 0.8, 0.2)
tween.parallel().tween_property(new_card, "translation:x", new_card.translation.x + 3.0, 0.3).set_trans(Tween.TRANS_BACK)
tween.tween_property(new_card, "transform", target_transform, 0.5)
手札がある場合は、tweenで捨札に移動させている
tween.tween_property(child, "translation", cards_resting_place.translation, 1)
デッキからカードを引く
new_card を instance()で生成して、hand.add_child(new_card)してるところまでは理解できる
カードの位置を決める計算が分からない
最後のtweenでは、カードの scale を大きくして見えるようにし、parallel でデッキの位置からずらして表示。
その後、計算で決めた位置と大きさになるようにカードをtweenしている